Next: Numeric Conversions, Previous: Predicates on Numbers, Up: Numbers [Contents][Index]
To test numbers for numerical equality, you should normally
use =, not eq. There can be many
distinct floating-point objects with the same numeric value. If
you use eq to compare them, then you test whether
two values are the same object. By contrast,
= compares only the numeric values of the
objects.
In Emacs Lisp, each integer is a unique Lisp object.
Therefore, eq is equivalent to = where
integers are concerned. It is sometimes convenient to use
eq for comparing an unknown value with an integer,
because eq does not report an error if the unknown
value is not a number—it accepts arguments of any type. By
contrast, = signals an error if the arguments are
not numbers or markers. However, it is better programming
practice to use = if you can, even for comparing
integers.
Sometimes it is useful to compare numbers with
equal, which treats two numbers as equal if they
have the same data type (both integers, or both floating point)
and the same value. By contrast, = can treat an
integer and a floating-point number as equal. See Equality
Predicates.
There is another wrinkle: because floating-point arithmetic is not exact, it is often a bad idea to check for equality of floating-point values. Usually it is better to test for approximate equality. Here’s a function to do this:
(defvar fuzz-factor 1.0e-6)
(defun approx-equal (x y)
(or (= x y)
(< (/ (abs (- x y))
(max (abs x) (abs y)))
fuzz-factor)))
Common Lisp note: Comparing numbers in Common Lisp always requires
=because Common Lisp implements multi-word integers, and two distinct integer objects can have the same numeric value. Emacs Lisp can have just one integer object for any given value because it has a limited range of integers.
This function tests whether all its arguments are
numerically equal, and returns t if so,
nil otherwise.
This function acts like eq except when both
arguments are numbers. It compares numbers by type and
numeric value, so that (eql 1.0 1) returns
nil, but (eql 1.0 1.0) and
(eql 1 1) both return t.
This function tests whether its arguments are numerically
equal, and returns t if they are not, and
nil if they are.
This function tests whether each argument is strictly less
than the following argument. It returns t if so,
nil otherwise.
This function tests whether each argument is less than or
equal to the following argument. It returns t if
so, nil otherwise.
This function tests whether each argument is strictly
greater than the following argument. It returns
t if so, nil otherwise.
This function tests whether each argument is greater than
or equal to the following argument. It returns t
if so, nil otherwise.
This function returns the largest of its arguments. If any of the arguments is floating point, the value is returned as floating point, even if it was given as an integer.
(max 20)
⇒ 20
(max 1 2.5)
⇒ 2.5
(max 1 3 2.5)
⇒ 3.0
This function returns the smallest of its arguments. If any of the arguments is floating point, the value is returned as floating point, even if it was given as an integer.
(min -4 1)
⇒ -4
This function returns the absolute value of number.
Next: Numeric Conversions, Previous: Predicates on Numbers, Up: Numbers [Contents][Index]